package pe.com.cotelasa.scp.controlador;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.Map;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.inject.Inject;
import javax.inject.Named;

import org.apache.log4j.Logger;
import org.primefaces.event.FileUploadEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;

import com.thoughtworks.xstream.XStream;
import java.nio.charset.Charset;

import pe.com.cotelasa.common.controlador.MBGenerico;
import pe.com.cotelasa.scp.common.IObserver;
import pe.com.cotelasa.scp.controlador.backingBean.BKContacto;
import pe.com.cotelasa.scp.controlador.backingBean.BKEmpresa;
import pe.com.cotelasa.scp.controlador.backingBean.BKUbigeo;
import pe.com.cotelasa.scp.controlador.comando.ComandoActualizar;
import pe.com.cotelasa.scp.controlador.comando.ComandoGuardar;
import pe.com.cotelasa.scp.dominio.common.Constantes;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.common.TIPO_CONTACTO;
import pe.com.cotelasa.scp.dominio.common.URLPaginacion;
import pe.com.cotelasa.scp.dominio.common.util.UtilitarioCadenas;
import pe.com.cotelasa.scp.dominio.excepcion.ModelExcepcion;
import pe.com.cotelasa.scp.dominio.modelo.EmpresaModel;
import pe.com.cotelasa.scp.dominio.service.IServicioEmpresa;
import pe.com.cotelasa.scp.entidad.Contacto;
import pe.com.cotelasa.scp.entidad.Empresa;
import pe.com.cotelasa.scp.entidad.Sede;
import pe.com.cotelasa.scp.entidad.Ubigeo;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKSession;

@Named(value = "MBEmpresa")
@Scope("request")
public class MBEmpresa extends MBGenerico implements IMantenedor, IObserver, Serializable {

    private static final long serialVersionUID = -2192358061965906812L;
    private static Logger logger = Logger.getLogger(MBEmpresa.class);
    @Inject
    private EmpresaModel empresaModel;
    @Inject
    private MBUbigeo mbUbigeo;
    @Inject
    private BKEmpresa bkEmpresa;
    @Inject
    private BKUbigeo bkUbigeo;
    @Inject
    private BKContacto bkContacto;
    private String URL;
    @Autowired
    BKSession session;

    public MBEmpresa() {
    }

    public String mostrarMantenimiento() {
        bkEmpresa.setEmpresaBusqueda(new Empresa());
        bkContacto.setEstaTipoComtacto(false);
        bkContacto.setTipoContacto(TIPO_CONTACTO.REPRESENTANTE.getValor());
        bkEmpresa.setVerFormulario(false);
        bkEmpresa.setListaEmpresasActivos(null);
        return URLPaginacion.Empresa.URL_LISTA_EMPRESA;
    }

    public void buscar() {
        try {
            bkEmpresa.setListaEmpresasActivos(empresaModel.buscarListaEmpresa(bkEmpresa.getEmpresaBusqueda()));
        } catch (ModelExcepcion e) {
            mostrarError(serviceProperties.getProperty("cotelasa.message.errorListar"));
            logger.error(e.getMessage(), e);
        }
    }

    @Override
    public String editar() {
        try {
            bkEmpresa.setComando(new ComandoActualizar(this));
            bkEmpresa.setLogo(null);
            Empresa empresa = empresaModel.obtenerEmpresaPorId(bkEmpresa.getEmpresaFormulario().getId());
            bkEmpresa.setEmpresaFormulario(empresa);
            bkUbigeo.inicializarValores(empresa.getIdUbigeo().getIdPais(), empresa.getIdUbigeo(), false, empresa.getDescUbicacion());
            mbUbigeo.addObserver(this);
            
            bkContacto.setListaContacto(new ArrayList<Contacto>());
            bkContacto.setListaContactoEditar(new ArrayList<Contacto>());
            for (Sede sede : empresa.getSedeCollection()) {
                if (sede.getSedeAdministradora() == 1) {
                    bkEmpresa.setSedeAdminstradora(sede);
                }
            }

            bkContacto.setListaContactoEditar(empresaModel.buscarRepresentantes(empresa));
            for (Contacto contacto : bkContacto.getListaContactoEditar()) {
                System.out.println("id de tipo de contacto : "+contacto.getIdTipoContacto().getId());
                if (contacto.getEstadoRegistro() == ESTADO_REGISTRO.ACTIVO.getValor()) {
                    bkContacto.getListaContacto().add(contacto);
                }

            }


        } catch (Exception e) {
            mostrarError(serviceProperties.getProperty("cotelasa.message.errorCargar"));
            logger.error(e.getMessage(), e);
        }

        return URLPaginacion.Empresa.URL_FORMULARIO_EMPRESA;
    }

    @Override
    public String guardar() {
        try {
            Empresa empresa = bkEmpresa.getEmpresaFormulario();
            empresa.setUsrCreacion(session.getUsuario().getUsuario());
            empresa.setFecCreacion(new Date());
            if (bkEmpresa.getLogo() != null) {
                empresa.setLogo(bkEmpresa.getLogo().getFileName());
            }
            if (bkEmpresa.getLogoDoc() != null) {
                empresa.setLogoDoc(bkEmpresa.getLogoDoc().getFileName());
            }
            empresa.setRazonSocial(UtilitarioCadenas.convertirUTF8(empresa.getRazonSocial()));
            empresa.setNombreComercial(UtilitarioCadenas.convertirUTF8(empresa.getNombreComercial()));
            empresa.setDescUbicacion(UtilitarioCadenas.convertirUTF8(empresa.getDescUbicacion()));
            empresa.setDireccionLegal(UtilitarioCadenas.convertirUTF8(empresa.getDireccionLegal()));
            empresa.setObservacion(UtilitarioCadenas.convertirUTF8(empresa.getObservacion()));
            empresa.setSigla(UtilitarioCadenas.convertirUTF8(empresa.getSigla()));
            empresaModel.guardarEmpresa(empresa, bkContacto.getListaContacto(), 
                    bkEmpresa.getLogo(), bkEmpresa.getLogoDoc());

            mostrarMensaje(serviceProperties.getProperty("cotelasa.message.guardar"));
            buscar();
            URL = cancelar();
        } catch (ModelExcepcion e) {
            if (e.getCodigoError().equalsIgnoreCase(Constantes.CodigoErrorEmpresa.CODIGO_ERROR_RUC)) {
                mostrarError(serviceProperties.getProperty("cotelasa.message.errorRucPorEmpresa"));
            } else if (e.getCodigoError().equalsIgnoreCase(Constantes.CodigoErrorEmpresa.CODIGO_ERROR_RAZON_SOCIAL)) {
                mostrarError(serviceProperties.getProperty("cotelasa.message.errorRazonSocialExistente"));
            } else {
                mostrarError(serviceProperties.getProperty("cotelasa.message.errorGuardar"));
                logger.error(e.getMessage(), e);
            }
        } catch (Exception e) {
            mostrarError(serviceProperties.getProperty("cotelasa.message.errorGuardar"));
            logger.error(e.getMessage(), e);
        } 
        return URL;
    }

    @Override
    public String actualizar() {
        try {
            Empresa empresa = bkEmpresa.getEmpresaFormulario();
            empresa.setUsrModificacion(session.getUsuario().getUsuario());
            empresa.setFecModificacion(new Date());
            if (bkEmpresa.getLogo() != null) {
                empresa.setLogo(bkEmpresa.getLogo().getFileName());
            }
            if (bkEmpresa.getLogoDoc() != null) {
                empresa.setLogoDoc(bkEmpresa.getLogoDoc().getFileName());
            }
            //bkEmpresa.getSedeAdminstradora().setContactoCollection(bkContacto.getListaContactoEditar());
            empresa.setRazonSocial(UtilitarioCadenas.convertirUTF8(empresa.getRazonSocial()));
            empresa.setNombreComercial(UtilitarioCadenas.convertirUTF8(empresa.getNombreComercial()));
            empresa.setDescUbicacion(UtilitarioCadenas.convertirUTF8(empresa.getDescUbicacion()));
            empresa.setDireccionLegal(UtilitarioCadenas.convertirUTF8(empresa.getDireccionLegal()));
            empresa.setObservacion(UtilitarioCadenas.convertirUTF8(empresa.getObservacion()));
            empresa.setSigla(UtilitarioCadenas.convertirUTF8(empresa.getSigla()));
            empresaModel.actualizarEmpresa(empresa, bkEmpresa.getSedeAdminstradora(), bkContacto.getListaContactoEditar(),
                    bkEmpresa.getLogo(), bkEmpresa.getLogoDoc());

            mostrarMensaje(serviceProperties.getProperty("cotelasa.message.actualizar"));
            buscar();
            URL = cancelar();
        } catch (ModelExcepcion e) {
            if (e.getCodigoError().equalsIgnoreCase(Constantes.CodigoErrorEmpresa.CODIGO_ERROR_RUC)) {
                mostrarError(serviceProperties.getProperty("cotelasa.message.errorRucPorEmpresa"));
            } else if (e.getCodigoError().equalsIgnoreCase(Constantes.CodigoErrorEmpresa.CODIGO_ERROR_RAZON_SOCIAL)) {
                mostrarError(serviceProperties.getProperty("cotelasa.message.errorRazonSocialExistente"));
            } else {
                mostrarError(serviceProperties.getProperty("cotelasa.message.errorGuardar"));
                logger.error(e.getMessage(), e);
            }
        } catch (Exception e) {
            mostrarError(serviceProperties.getProperty("cotelasa.message.errorActualizar"));
            logger.error(e.getMessage(), e);
            URL = URLPaginacion.Empresa.URL_FORMULARIO_EMPRESA;
        }
        return URL;
    }

    @Override
    public String nuevo() {
        bkEmpresa.setComando(new ComandoGuardar(this));
        bkEmpresa.setEmpresaFormulario(new Empresa());
        bkUbigeo.inicializarValores(null, null, false, null);
        bkEmpresa.setDescripcionUbigeo(null);
        mbUbigeo.addObserver(this);
        bkContacto.setListaContacto(new ArrayList<Contacto>());
        bkEmpresa.setLogo(null);

        return URLPaginacion.Empresa.URL_FORMULARIO_EMPRESA;
    }

    public void eliminar(ActionEvent actionEvent) {
        try {
            Empresa empresa = bkEmpresa.getCurrentEmpresa();
            
            empresaModel.eliminarEmpresa(empresa,session.getUsuario().getUsuario());
            bkEmpresa.setListaEmpresasActivos(empresaModel.buscarListaEmpresa(bkEmpresa.getEmpresaFormulario()));
            //mostrarMensaje(serviceProperties.getProperty("cotelasa.message.eliminar"));
            buscar();
            mostrarMensaje("Se eliminó los datos de la empresa satisfactoriamente");
        } catch (Exception e) {
            //mostrarError(serviceProperties.getProperty("cotelasa.message.errorEliminar"));
            mostrarMensaje("Ocurrieron algunos problemas al eliminar la información");
            logger.error(e.getMessage(), e);
        }
    }

    public String aceptar() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String cancelar() {
        bkEmpresa.setEmpresa(new Empresa());
        bkContacto.setListaContacto(new ArrayList<Contacto>());
        bkContacto.setListaContactoEditar(new ArrayList<Contacto>());
        bkEmpresa.setVerFormulario(false);
        return URLPaginacion.Empresa.URL_LISTA_EMPRESA;
    }

    @Override
    public String ver() {
        
        editar();
        
       /*
        Empresa emp;        
        emp = servicioEmpresa.conseguirEmpresaPorId(bkEmpresa.getEmpresaFormulario().getId());
        bkEmpresa.setEmpresa(emp);
       */ 
        bkEmpresa.setVerFormulario(true);
        return URLPaginacion.Empresa.URL_VER_EMPRESA;
    }

    @Override
    public String retroceder() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @SuppressWarnings("unchecked")
    @Override
    public void actualizarObservador(Object object) {
        Map<String, Object> datos = (Map<String, Object>) object;
        bkEmpresa.getEmpresaFormulario().setDescUbicacion((String) datos.get("descripcionUbigeo"));
        bkEmpresa.getEmpresaFormulario().setIdUbigeo((Ubigeo) datos.get("ubigeo"));
    }

    public String obtenerUbigeo() {
        logger.info("Obteniendo ubigeo");
        return "";
    }

    public void obtenerListaRepresentantes() {
        try {
            if (bkEmpresa.getEmpresa() != null) {

                bkContacto.setListaContacto(empresaModel.obtenerListaRepresentantes(bkEmpresa.getEmpresa()));
                bkContacto.getListaContactoEditar().addAll(bkContacto.getListaContacto());
            }
        } catch (ModelExcepcion e) {
            mostrarError(serviceProperties.getProperty("cotelasa.message.errorCargar"));
            logger.error(e.getMessage(), e);
        }
    }

    public void handleFileUpload(FileUploadEvent event) {
        logger.info("handleFileUpload " + event.getFile());
        bkEmpresa.setLogo(event.getFile());
        FacesMessage msg = new FacesMessage("Succesful", event.getFile().getFileName() + " is uploaded.");
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }
    
    public void handleFileUpload2(FileUploadEvent event) {
        logger.info("handleFileUpload " + event.getFile());
        bkEmpresa.setLogoDoc(event.getFile());
        FacesMessage msg = new FacesMessage("Succesful", event.getFile().getFileName() + " is uploaded.");
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }
}
